import {  DmgTypeKey, FormulaDmgResultType, ReboundArrowDtl, UnitAttrStruct } from "../../types/L_Type";
import UnitX from "../../entity/UnitX";
import L_Run from "../../utils/L_Run";
import DmgExecutor from "../dmgabout/DmgExecutor";
import XAbilityExecutor from "../x_ability/XAbilityExecutor";
import BrkStrikeFormula, { BrkStrikeRs } from "./CrackStrikeFormula";
import TenaManager from "./TenaManager";



/**  */
export default class CrackStrikeExecutor{
 
 
    /**
     * 执行一次崩解打击 
     * 神御判定+破招+削韧+技能伤害
     * @param baseBtVal 基础破招值
     * @param baseTennaR 基础削韧值
     * @param aux 进攻单位
     * @param bux 防御单位
     * @param dmgFinalVal 最终伤害  注意这里不再有额外基础lvl等加成的计算了 （通常崩解打击的基础伤害较低 由成功破招动作来放大伤害）
     * @param additTrgProb 触发系数
     * @param dmgTypeKey 伤害类型
     * @return 
     */
    public static execCrackStrike(baseBtVal:number,baseTennaR:number,aux:UnitX,bux:UnitX,dmgFinalVal:number,additTrgProb:number,dmgTypeKey:DmgTypeKey,extraDmgAttr?:UnitAttrStruct):BrkStrikeRs & FormulaDmgResultType {
        

        //1.-------------判断崩解技是否被完美防御 或者受目标防御架势值影响数值------------
       let bsRs:BrkStrikeRs= BrkStrikeFormula.breakStrikeSts(baseBtVal,baseTennaR,aux,bux)

       if(bsRs.prefectDef){
        //触发完美防御的默认玩家携带韧性反打击  以及一些额外收益
        XAbilityExecutor.trgAndExecXAbility(aux,bux,bux,'god_def',dmgTypeKey)
       }

       //2.-------------非完美防御的崩解技能是否对目标造成破招效果 即时没有命中也可以打断目标动作 这很符合现实逻辑（让目标有闪避动作了。。） 也增加了破招行为的收益-----------
       //  破招 破招是一个几率动作 防御架势差值越大 触发打断破招几率越大 参考BrkStrikeFormula.breakStrikeSts的破招公式  
       if(bsRs.breakAction){
            let btcEventMap=bux.getEventTypeMap('CHARGED_UP_WITH_LOSE_DEF')
            let pn=0
            btcEventMap?.forEach((value)=>{
                value.endImmed()
                pn++
            })
            if(pn>0){
                //触发攻击者破招收益Xability
                XAbilityExecutor.trgAndExecXAbility(aux,bux,aux,'brk_action',dmgTypeKey)
                console.log("【破招！！！】")
            }
       } 

       //3.-----------伤害执行 命中判定  ------------
       let dmgRs:FormulaDmgResultType=DmgExecutor.dmgUnitByAbility(aux,bux,dmgFinalVal*bsRs.dmgCorrectionRate,additTrgProb,dmgTypeKey,extraDmgAttr)

       //4.-----------韧性削减  ------------
       // 只有命中了才会降低目标的韧性  如果是完美防御tenaReduceVal恒为0 所以防御架势是非常重要的收益属性 
       // 如果有韧性削减会连锁触发，削韧后通过返回值查看目标是否进入气竭状态
       if(dmgRs.hit && bsRs.tenaReduceVal>0){
            XAbilityExecutor.trgAndExecXAbility(aux,bux,aux,'reduce_tena',dmgTypeKey)
            if(TenaManager.reduceUnitTena(bux,bsRs.tenaReduceVal)){
                //如果触发目标气竭
                XAbilityExecutor.trgAndExecXAbility(aux,bux,aux,'brk_tena',dmgTypeKey)
            }

       }else{
        console.log(">>>>>>>>削韧打击MISS>>>>>>>>>>")
       }

      return {...bsRs,...dmgRs}
    }




  
}  